package tech.aistar.day04;

/**
 * 本类用来演示: 递归算法
 *
 * @author: success
 * @date: 2021/3/11 10:14 上午
 */
public class RecursiveDemo {
    public static void main(String[] args) {
//        System.out.println(commonDivisor(20,12));
//
//        System.out.println(yangHui(3,1));
//
//        printYangHui(5);
//
//        System.out.println(feiFor(10));

        printFac(5);
    }

//    阶乘
    public static int fac(int n){
        //2. 方法体中一定要有出口 - 优先要考虑的.
        if(n==1)
            return 1;//java.lang.StackOverflowError堆栈溢出了

        //1. 方法体中调用自己
        return n*fac(n-1);//6*fac(5)
                            //6*5*4*3*2*1
    }

    //斐波那契数列
    //1 1 2 3 5 8 13 21 34 55 ...
    public static int fei(int n){//n代表的就是位置
        if(n==1 || n==2)
            return 1;
        return fei(n-1) + fei(n-2);

        //fei(5) = fei(4) + fei(3)
        //         fei(3)+fei(2) + fei(2)+fei(1)
        //       fei(2)+fei(1) + fei(2) + fei(2)+fei(1)
        //       1 1 1 1 1 = 5
    }

    //俩个数的最大公约数
    public static int commonDivisor(int m,int n){
        if(m % n == 0)
            return n;
        return commonDivisor(n,m%n);

        //20,12 -> commonDivisor(12,8) -> commonDivisor(8,4)
    }

    //杨辉三角

    /**
     * 1
     * 1 1
     * 1 2 1
     * 1 3 3 1
     * 1 4 6 4 1
     *
     * @param i 行
     * @param j 列
     * @return i行i列对应的杨辉三角的值
     */
    public static int yangHui(int i,int j){
        if(j==1 || i==j)
            return 1;
        return yangHui(i-1,j-1) + yangHui(i-1,j);
    }

    /**
     * 打印n行
     * @param n
     */
    public static void printYangHui(int n){
        for (int i = 1; i <=n; i++) {
            for (int j = 1; j <=i ; j++) {
                System.out.print(yangHui(i,j)+"\t");
            }
            System.out.println();
        }
    }

    //斐波那契数 - for循环
    public static int feiFor(int n){

        //判断
        if(n == 1 || n == 2){
            return 1;
        }

        //定义初始值
        int start = 1;
        int end = 1;
        //定义一个变量,用来保存计算的结果
        int sum= 0;

        //1 1 2 3 5 8
        //1 + 1  = 2 sum
        //1 + 2 = 3 sum
        //2 + 3 = sum
        for (int i = 3; i <=n ; i++) {
            sum = start + end;
            start = end;
            end = sum;
        }
        return sum;
    }

    /**
     * 1!=1
     * 2!=2
     * 3!=6
     * ..
     * ..
     * ..
     * ..
     * ...
     * 1!+2!+3!=9
     *
     */
    public static void printFac(int n){
        //定义一个变量 - sum - 每个i的对应的阶乘的数据
        int sum = 1;
        //定义一个变量 - 用来保存所有的数据的阶乘的综合
        long total = 0L;
        //定义一个变量 - 拼接最后的表达式
        String str = "";
        for (int i = 1; i <=n ; i++) {
            sum*=i;//sum = sum * i;
            System.out.println(i+"!="+sum);

            str+=(i!=n)?(i+"!+"):(i+"!");
            total+=sum;
        }
        System.out.println(str+"="+total);
    }

}
